const path = require('path')

const HappyPack = require('happypack')
const os = require('os')

// HappyPack 进程池
const threadPool = HappyPack.ThreadPool({
    // 根据当前计算机的 CUP 数量来决定进程池的进程数量
    size: os.cpus().length
})

module.exports = {
    mode: 'development',

    devtool: false,

    entry: {
        app1: './src/index1.js',
        app2: './src/index2.js',
    },

    output: {
        path: path.join(__dirname, 'dist'),
        filename: '[name].bundle.js'
    },

    optimization: {
        splitChunks: {
            cacheGroups: {
                // 抽取我们自己编写的公共代码
                // 模块组1：公共函数
                commons: {
                    minChunks: 2,  // 模块被引用次数大于等于2次
                    chunks: 'initial', // initial初始化的时候既要拆分
                    name: 'commons',
                    // 由于当前我们的 common 模块代码较少（小于20K），
                    // 所以默认不会生成独立的 chunk 文件的，而使用 enforce 可强制生成
                    enforce: true,
                },

                // 抽取通过 npm 安装的 node_modules 下的模块
                // 模块组2： 第三方库
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    chunks: 'all',  //   
                    name: 'vendors',
                },
            },
        }
    },

    module: {
        noParse: /jquery/,
        rules: [
            // ...
            {
                // 处理 js 文件
                test: /\.js$/,
                // 记得一定要排除掉通过包管理器安装的代码目录，否则转换会非常慢
                exclude: /node_modules/,
                // 配置 babel-loader (通过 happypack 运行)
                use: 'happypack/loader?id=happyBabel'
            }
        ]
    },


    // 插件
    plugins: [
        // ...
        new HappyPack({
            id: 'happyBabel',
            loaders: [{
                loader: 'babel-loader',
                options: {
                    presets: ['@babel/preset-env'],
                    plugins: ['@babel/plugin-transform-runtime']
                }
            }],
            threadPool,
            verbose: true
        })
    ]
}


